{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入所需工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)# 打印日志信息"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-055d363e7e39>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From C:\\Users\\93246\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From C:\\Users\\93246\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./data/MNIST_data\\train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\Users\\93246\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./data/MNIST_data\\train-labels-idx1-ubyte.gz\n",
      "Extracting ./data/MNIST_data\\t10k-images-idx3-ubyte.gz\n",
      "Extracting ./data/MNIST_data\\t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\Users\\93246\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./data/MNIST_data\")# 如果数据已经提前下载好，那就指定相应的目录就可以了。\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上面的结果可以看出训练集、验证集，测试集有不同数量的数据，并且图片的大小是用一维向量保存的。所以，如果要展示图像的话，需要将其转化为二维向量。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 展示数据集图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 定义网络模型:这里定义单个隐层的全连接网络模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 初始化参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=tf.placeholder(tf.float32,[None,784],name=\"x\")# None 表示batch_size,因为现在还不知道训练时候的batch_size，所以先用None占位。\n",
    "y=tf.placeholder(tf.int64,[None],name=\"y\")# 特别注意的是，这里的y是int64类型的数据；另外shape用None占位，batch_size 是多少，对应的y值就有多少。\n",
    "w1=tf.Variable(tf.truncated_normal([784,100]),name=\"weight_1\")# 用截断的高斯分布来初始化w参数,第一层用100个神经元。\n",
    "b1=tf.Variable(tf.zeros([100]),name=\"bias_1\")# 权重参数可以用0初始化\n",
    "w2=tf.Variable(tf.truncated_normal([100,10]),name=\"weight_2\")# 用截断的高斯分布来初始化w参数,第二层输出10个类别的得分值。\n",
    "b2=tf.Variable(tf.zeros([10]),name=\"bias_2\")\n",
    "learning_rate = tf.placeholder(tf.float32)# 学习率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 定义网络结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "logits_1 =tf.matmul(x,w1)+ b1\n",
    "output_1=tf.nn.relu(logits_1)# 使用relu激活函数\n",
    "logits_2=tf.matmul(output_1,w2)+b2# 得到的是属于每个类别的得分值\n",
    "y_pre = tf.nn.softmax(logits_2) # 得到的是属于每一个类别的概率值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对模型结构的理解10分。 \n",
    "   \n",
    "这里定义了具有一层隐层的全连接网络：  \n",
    "使用全连接网络对输入数据的要求：   \n",
    "输入层：对于图像数据，需要将其拉长成一个长条，即一维数据，才能将其送入网络。所以x=tf.placeholder(tf.float32,[None,784],name=\"x\")  \n",
    "隐层：这里定义了100个神经元，所以w1参数的shape为w1=tf.Variable(tf.truncated_normal([784,100]),name=\"weight_1\")，b1=tf.Variable(tf.zeros([100]),name=\"bias_1\")     \n",
    "输出层：由于此任务是10分类任务，所以输出层应该有10个神经元，所以w2=tf.Variable(tf.truncated_normal([100,10]),name=\"weight_2\")  \n",
    "b2=tf.Variable(tf.zeros([10]),name=\"bias_2\"),表示该样本属于每一个类别的得分值，也可以将其转化为概率值。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 定义loss和用于优化网络的优化器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss =tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits=logits_2))# 因为是batch输入数据，所以要求平均。\n",
    "optimizer =tf.train.GradientDescentOptimizer(learning_rate=learning_rate)# 这里使用梯度下降优化器\n",
    "train_op=optimizer.minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对模型训练过程（梯度如何计算，参数如何更新）的理解10分。\n",
    "   \n",
    "这里使用的是SGD优化算法：模型一次性输入一个batch的数据，通过计算得到这次迭代的损失值，然后依照梯度下降的方法（对参数求偏导）求得模型可训练参数（这里有w1,b1,w2,b2参数）的更新方向，然后根据梯度更新公式w(new)=w(old)-η▽w来更新模型参数。   \n",
    "等到下一批训练数据输入模型时，就按照更新的参数值来计算损失值，然后再根据梯度下降来更新参数值，就这样一步一步迭代下去，得到最优的参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "correct_pred = tf.equal(tf.argmax(y_pre, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))#模型的精度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对计算图的理解10分。   \n",
    "   \n",
    "前面一系列tf.的操作实际上都只是构造了一张计算图，并没有真正地进行计算。   \n",
    "而计算图由节点（node）构成：  \n",
    "每个节点包括当前节点的名字（name）；   \n",
    "运算操作（op）：是加法还是减法、是乘法还是除法；   \n",
    "输入数据（input）：输入当前节点数据的shape；   \n",
    "Device：是用cpu训练还是Gpu训练。   \n",
    "   \n",
    "而要执行计算图中的运算，必须要构造session才能运算。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 创建session，训练模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 1.53588, the validation accuracy is 0.7674\n",
      "after 200 training steps, the loss is 1.70812, the validation accuracy is 0.7762\n",
      "after 300 training steps, the loss is 0.905139, the validation accuracy is 0.8098\n",
      "after 400 training steps, the loss is 0.537715, the validation accuracy is 0.8206\n",
      "after 500 training steps, the loss is 1.10462, the validation accuracy is 0.8404\n",
      "after 600 training steps, the loss is 0.999206, the validation accuracy is 0.8462\n",
      "after 700 training steps, the loss is 1.19076, the validation accuracy is 0.8584\n",
      "after 800 training steps, the loss is 0.550903, the validation accuracy is 0.8556\n",
      "after 900 training steps, the loss is 0.7286, the validation accuracy is 0.8682\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.8712\n"
     ]
    }
   ],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "saver = tf.train.Saver()\n",
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "    for i in range(trainig_step):\n",
    "            xs, ys = mnist.train.next_batch(batch_size)\n",
    "            _, loss = sess.run(\n",
    "                [train_op, cross_entropy_loss],\n",
    "                feed_dict={\n",
    "                    x: xs,\n",
    "                    y: ys,\n",
    "                    learning_rate: 0.3\n",
    "                })\n",
    "\n",
    "            #每100次训练打印一次损失值与验证准确率\n",
    "            if i > 0 and i % 100 == 0:\n",
    "                validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "                print(\n",
    "                    \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                    % (i, loss, validate_accuracy))\n",
    "                saver.save(sess, './data/model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 用我们训练的模型做一个测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./data\\model.ckpt-900\n",
      "0.875\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./data')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [y_pre, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "解释这⾥的模型为什么效果⽐较差10分。 \n",
    "   \n",
    "从上面的结果来看，效果不是很好，有几张图片是识别错误的。  \n",
    "究其原因，有以下几点：  \n",
    "1.学习率过大：前期的学习率大一点还好，到训练的后期，需要将学习率调小一点，这样模型才能够更容易优化到极值点。   \n",
    "2.模型迭代次数不够。      \n",
    "3.模型的连接方式：这里使用的是全连接的连接方式，而这种网络模型对于图像的特征提取效果不是很好，用卷积网络处理图像特征的效果更好。   \n",
    "4.模型的复杂度不够：这里只用了一层隐层的全连接网络，而且神经元的个数也很少。   \n",
    "5.模型优化器对结果也有影响。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
